#include "AppendFile.h"
#include <cstddef>
#include <stdio.h>

namespace droneswarm
{

    AppendFile::AppendFile( std::string filename )
        : fp_( fopen( filename.c_str(), "ae" ) )
    {
        //该函数用来设置文件流的缓冲区，参数stream为文件流指针，buf为缓冲区的地址，size为缓冲区的大小
        //函数 setbuffer() 是 C 语言标准 I/O 库中的一个函数，用于设置给定文件流的缓冲区。
        //它允许程序员手动指定一个缓冲区和其大小，以代替库默认的缓冲机制。
        setbuffer( fp_, buffer_, sizeof( buffer_ ) );
    }
    AppendFile::~AppendFile() { fclose( fp_ ); }

    void AppendFile::append( const char *logline, const size_t len )
    {
        size_t n = this->wirte( logline, len );
        size_t remain = len - n;
        while ( remain > 0 )
        {
            //写剩余的内容
            size_t x = this->wirte( logline + n, remain );
            //判断写入是否成功
            if ( x == 0 )
            {
                int err = ferror( fp_ );
                if ( err )
                {
                    fprintf( stderr, "AppendFile::append() failed %d\n", err );
                }
                break;
            }
            n += x;
            remain = len - n;
        }
    }

    void AppendFile::flush() { fflush( fp_ ); }

    size_t AppendFile::wirte( const char *logline, size_t len ) { return fwrite_unlocked( logline, 1, len, fp_ ); }
}  // namespace droneswarm